14章 pydanticによる実行時型チェック
早い段階でエラーを見つけたい(シフトレフト)
ここまでの『ロバストPython』で型チェッカの使い方を指南してきた
ユーザは不正なデータを渡す
プログラム外から渡る不正データ
読み込んだときにエラーを検知したい(14.1)
型チェッカと実行時エラーの間隙を埋めるバリデーションロジックが必要(14.3)
可読性を犠牲にせずバリデーションロジックのコード量を削減できる (14章 冒頭)
型定義を読む開発者は、そのデータ型のオブジェクトに課された制約を正確に把握できる。(14.3)
読みやすい型定義があるだけだが、実行時チェックも追加されている(IMO:一石二鳥感)
IMO:Pydanticはドメインモデルレベルで使えるものなのだろうか?(プログラム言語同様の抽象と言える?)
レストランを表すデータ型の例
PyYAMLで読み込み、データ型として持つ
TypedDictを使う案(14.1)
ユーザのデータを読み込む関数は辞書を返す(TypedDictを返すでアノテーションしただけ)
アノテーションされた関数からは、ユーザのデータが不正なら誤った辞書が返る(フィールドが足りないなど)
返ったTypedDictを使う側はキー名や値の型のバリデーションが効く
フィールドのバリデーションも辞書の利用者がやる
Pydantic(14.2)
データを読み込む関数でオブジェクト構築までする(return Restaurant(**data))
pydanticによりオブジェクト構築時にバリデーション。読み込んだときのエラー検知が実現
バリデータ
constr
何文字以上・以下
正規表現にマッチした文字列
conlist
要素数の制約
@validator("属性名")
Pydanticはパースライブラリ
出るものが正しいことを保証する
入力に制限を加えるにはstrictフィールドを使う
不変式(10章参照)まわり
pydanticのdataclassデコレータ、つまりデータクラス
pydanticを使えば、特殊メソッド__init__()を呼び出したり、フィールドを設定したりする場合も含めて不変式を守れる
データクラスとクラスの間隙も埋める
著者の主張として、フィールドに相互依存があればデータクラスではなくクラスを使うべき